package tool

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/x/bsonx"
)

type MongodbStore struct {
	client *mongo.Database
}

func getContext() (ctx context.Context) {
	ctx, _ = context.WithTimeout(context.Background(), 10*time.Second)
	return
}
func InitMongodbStore() (*MongodbStore, error) {

	config := GetConfig().MongodbConfig

	uri := "mongodb://" + config.UserName + ":" + config.Password + "@" + config.Host + ":" + config.Port + "/" + config.DbName + "?ssl=" + fmt.Sprintf("%t", config.Ssl) + "&authSource=" + config.AuthSource
	fmt.Println(uri)
	// 设置客户端连接配置
	ctx, mongoclos := context.WithCancel(getContext())
	defer mongoclos()

	// 先在数据库设置用户名密码，再用 MongoDB Compass 测试一下是否能够连接，再用代码测试
	clientOptions := options.Client().ApplyURI("mongodb://" + config.Host + ":" + config.Port + "/" + config.DbName)
	// clientOptions := options.Client().ApplyURI(uri)

	// 连接到 MongoDB
	client, err := mongo.Connect(ctx, clientOptions)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("------------------------Connectieing!------------------------")
	// 检查连接
	err = client.Ping(ctx, nil)
	if err != nil {
		log.Fatal(err)
		return nil, err
	}
	fmt.Println("------------------------Connected to MongoDB!------------------------")

	database := client.Database(config.DbName)
	captchaCollection := database.Collection("captchacode")

	// 删除这个集合
	captchaCollection.Drop(getContext())

	indexModel := mongo.IndexModel{
		Keys:    bsonx.Doc{{Key: "expiredtime", Value: bsonx.Int64(1)}}, // 设置 TTL 索引列 "expiredtime" 与数据中的字段对应一下
		Options: options.Index().SetExpireAfterSeconds(1 * 60),          // 创建数据过期 60s 条目过期,自动删除 ,(1 * 24 * 3600 一天)
	}

	index, err := captchaCollection.Indexes().CreateOne(getContext(), indexModel) // 创建 TTL
	if err != nil {
		log.Fatalln(err.Error(), index)
		return nil, err
	}

	// Student 学生结构体
	type Student struct {
		Name        string
		Age         int8
		CreateTime  int64     // 必要的
		ExpiredTime time.Time // 必要的
	}
	s1 := Student{
		Name:        time.Now().UTC().String(),
		Age:         int8(time.Now().Unix()),
		CreateTime:  time.Now().Unix(),
		ExpiredTime: time.Now(),
	}
	insertOneRes, err := captchaCollection.InsertOne(context.TODO(), s1)
	if err != nil {
		log.Fatalln(err.Error(), insertOneRes.InsertedID)
		return nil, err
	}
	// fmt.Printf("InsertOne插入的消息ID:%v\n", insertOneRes.InsertedID)

	return &MongodbStore{client: database}, nil
}

/*
// 首先 创建库 创建用户用于远程连接
> use admin
# 查看是否已经有用户了
# >db.system.users.find()
# 创建一个 tom 用户
> db.createUser({user:"tom", pwd:"123456",roles:[{role:"readWrite", db:"captcha"}]})
# 可以再次修改 tom 用户为 root 权限
> db.grantRolesToUser("tom", [{role:"root", db:"admin"}])

> db.system.users.find() //查看用户
> 权限说明
    1. 数据库用户角色：read、readWrite;
    2. 数据库管理角色：dbAdmin、dbOwner、userAdmin；
    3. 集群管理角色：clusterAdmin、clusterManager、clusterMonitor、hostManager；
    4. 备份恢复角色：backup、restore；
    5. 所有数据库角色：readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色：root
*/
